package com.qf.fmall.index.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.fmall.index.entity.Category;
import com.qf.fmall.index.entity.Product;
import com.qf.fmall.index.entity.ProductImg;
import com.qf.fmall.index.mapper.CategoryDao;
import com.qf.fmall.index.mapper.ProductDao;
import com.qf.fmall.index.mapper.ProductImgDao;
import com.qf.fmall.index.service.ICategoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 商品分类 服务实现类
 * </p>
 *
 * @author dongjl
 * @since 2024-01-16
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> implements ICategoryService {

    @Autowired
    private ProductDao productDao;

    @Autowired
    private ProductImgDao productImgDao;

    @Override
    public List<Category> categoryList() {

        //1. 先查询所有一级分类的信息
        List<Category> firstData =
                list(new QueryWrapper<Category>().eq("parent_id", 0));

        //2. 查询一级分类下的二级分类
        for (Category firstCategory : firstData) {
            // 查询firstCategory的二级分类
            //# 查询id为1的分类的直属下级分类
            //  select * from category where parent_id=2;
            Integer firstId = firstCategory.getCategoryId();
            List<Category> secondData = list(new QueryWrapper<Category>().eq("parent_id", firstId));
            // 把查到的下级分类信息，设置到一级分类中
            firstCategory.setCategories(secondData);
            // 遍历所有的二级分类，查询三级分类数据
            for (Category secondCategory : secondData) {
                Integer secondId = secondCategory.getCategoryId();
                List<Category> thirdData = list(new QueryWrapper<Category>().eq("parent_id", secondId));
                secondCategory.setCategories(thirdData);
            }
        }

        return firstData;
    }

    /**
     * 减少对数据库表的查询次数
     * @return
     */
    @Override
    public List<Category> categoryListPro() {

        //1. 查询所有分类数据
        List<Category> allData = list();

        // 如何让 allData 中的每一个分类对象中的 categories 属性被正确赋值呢？
        // 构建一个 Map，key为 分类对象的id，value为 分类对象本身
        HashMap<Integer, Category> map = new HashMap<>();
        for (Category category : allData) {
            Integer categoryId = category.getCategoryId();
            map.put(categoryId,category);
        }

        // 获取一级分类数据并返回
        ArrayList<Category> result = new ArrayList<>();
        for (Category category : allData) {
            // 遍历的过程中，玩一个找爸爸的游戏
            // 如果 当前遍历的 category 的parentID不为0，说明他有爸爸
            // 需要设置 爸爸的 categories 去包含当前的 category对象
            Integer parentId = category.getParentId();
            // 从allData中找到 id为parentId的对象
            if (parentId.equals(0)){ // 一级分类
                result.add(category);
            }else {
                // 找爸爸
                Category parent = map.get(parentId);
                // 设置 parent 的categories包含当前的分类对象
                List<Category> categories = parent.getCategories();
                categories.add(category);
            }
        }

        return result;
    }

    @Override
    public List<Category> categoryRecommends() {

        //1. 查询所有一级分类
        List<Category> categories = list(new QueryWrapper<Category>().eq("parent_id", 0));

        //2. 遍历一级分类，查询分类下的商品信息
        for (Category category : categories) {

            QueryWrapper<Product> queryWrapper = new QueryWrapper<>();

            queryWrapper.eq("root_category_id",category.getCategoryId());
            queryWrapper.orderByDesc("sold_num");
            queryWrapper.last("limit 6");

            List<Product> products = productDao.selectList(queryWrapper);
            if (products!=null){
                addImgs(products);
                category.setProducts(products);
            }


        }

        return categories;
    }

    @Override
    public List<Category> categoryListSQl() {

        return getBaseMapper().listCategoryBysql();
    }


    private void addImgs(List<Product> products) {
        //1. 遍历products，查询每个商品对应的图片信息
        for (Product product : products) {
            Integer productId = product.getProductId();
            List<ProductImg> imgs = productImgDao.selectList(new QueryWrapper<ProductImg>().eq("product_id", productId));
            product.setImgs(imgs);
        }
    }
}
